/**
* Author: fulishang
* Create Time  : 2016年4月24日,下午9:55:39
* Modify Time :
* Desc  : 
*/
package com.sam.hr.common.dao.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.SessionFactory;

import com.sam.hr.common.dao.BaseDao;

public class BaseDaoHibernate4<T> implements BaseDao<T> {

	// DAO组建进行持久化操作底层依赖的sessionfactory组建
	private SessionFactory sessionFactory;

	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	// 依赖注入sessionfactory所需的setter方法
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	// 根据id加载实体
	@SuppressWarnings("unchecked")
	public T get(Class<T> entityClazz, Serializable id) {
		return (T) getSessionFactory().getCurrentSession().get(entityClazz, id);
	}

	// 保存实体
	public Serializable save(T entity) {
		return getSessionFactory().getCurrentSession().save(entity);
	}

	// 更新实体
	public void update(T entity) {
		getSessionFactory().getCurrentSession().saveOrUpdate(entity);
	}

	// 删除实体
	public void delete(T entity) {
		getSessionFactory().getCurrentSession().delete(entity);
	}

	// 根据id删除实体
	public void delete(Class<T> entityClazz, Serializable id) {
		getSessionFactory().getCurrentSession()
				.createQuery("delete " + entityClazz.getSimpleName() + " en where en.id = ?0").setParameter("0", id)
				.executeUpdate();
	}

	// 获取所有实体
	public List<T> findAll(Class<T> entityClazz) {
		return find("select en from " + entityClazz.getSimpleName() + " en");
	}

	// 获取实体总数
	public long findCount(Class<T> entityClazz) {
		List<?> list = find("select count(*) from " + entityClazz.getSimpleName());
		// 返回查询得到的实体总数
		if (list != null && list.size() == 1) {
			return (Long) list.get(0);
		}
		return 0;
	}

	// 根据hql语句返回查询实体
	@SuppressWarnings("unchecked")
	private List<T> find(String hql) {
		return (List<T>) getSessionFactory().getCurrentSession().createQuery(hql);
	}

	// 根据带占位符参数HQL语句查询实体
	@SuppressWarnings("unchecked")
	protected List<T> find(String hql, Object... params) {
		// 创建查询
		Query query = getSessionFactory().getCurrentSession().createQuery(hql);
		// 为包含占位符的HQL语句设置参数
		for (int i = 0, len = params.length; i < len; i++) {
			query.setParameter(i + "", params[i]);
		}
		return (List<T>) query.list();
	}
}
